package com.ambulance.project.biz.controller.agora;

import com.alibaba.fastjson.JSON;
import com.ambulance.framework.web.domain.AjaxResult;
import com.ambulance.framework.web.domain.AjaxResultData;
import com.ambulance.project.biz.entity.Dispatch;
import com.ambulance.project.biz.service.DispatchService;
import com.ambulance.project.biz.util.CreateFileUtil;
import com.ambulance.project.manager.utils.DoctorAndNurseCommonUtil;
import io.agora.recording.RecordingSDK;
import io.agora.recording.common.Common;
import io.agora.recording.common.RecordingConfig;
import io.agora.recording.common.RecordingEngineProperties;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.HashMap;

/**
 * @Author RXL
 * @Date 2020/7/11 15:27
 * @Version 1.0
 */
@Api(tags = {"声网-本地录制"})
@RestController
@RequestMapping(value = "/agora/v3/biz/")
public class AgoraLocalController {

    @Value(("${custom.profile}"))
    private String baseUrl = "/home/amb/uploadPath";

    /**
     * 录制端的 appId 必须与 Native/Web SDK 的保持一致
     */
    @Value(("${agora.appId}"))
    private String appid;

    /**
     * AgoraCoreServices 存放的目录
     */
    @Value(("${agora.appliteDir}"))
    private String appliteDir;

    /**
     * 低udp端口
     */
    @Value(("${agora.lowUdpPort}"))
    private Integer lowUdpPort;

    /**
     * 高udp端口
     */
    @Value(("${agora.highUdpPort}"))
    private Integer highUdpPort;

    /**
     * 频道超时退出时间
     */
    @Value(("${agora.idleLimitSec}"))
    private Integer idleLimitSec;

    /**
     * 设置录制文件存放的根目录。默认值为 NULL。
     * <p>
     * 设置该参数后，会按照录制日期自动生成子目录保存录制文件。
     */
    @Value(("${agora.recordFileRootDir}"))
    private String recordFileRootDir;

    /**
     * 用于鉴权的动态密钥。录制端的动态密钥必须与 Native/Web SDK 的保持一致。如果 Native/Web SDK 用了 token，该参数必须设为 token
     */
    private String channelKey = "";


    /**
     * 待录制频道的频道名。
     */
    private String name = "";

    /**
     * 录制使用的用户 UID。同一个频道里不能出现两个相同的 UID，否则会产生未定义行为。有两种设置方法：
     * 设置为 0，系统将自动分配一个 UID。
     * 设置一个唯一的 UID，不能与现在频道内的任何 UID 重复。取值范围：1 到 (232-1)。
     */
    private Integer uid = 0;

    /**
     * 录制的详细设置
     */
    private RecordingConfig recordingConfig;

    /**
     * 生成 log 的等级。设置完成后，只有等级低于所设 logLevel 的 log 才会被生成：
     * 1: 日志等级为 Fatal。
     * 2: 日志等级为 Error。
     * 3: 日志等级为 Warning。
     * 4: 日志等级为 Notice。
     * 5: 日志等级为 Info。
     * 6: 日志等级为 Debug
     */
    private Integer logLevel = 6;
    @Autowired
    private DoctorAndNurseCommonUtil padCommonUtil;
    @Autowired
    private DispatchService dispatchService;

    /**
     * 开始视频录制
     *
     * @param channelName
     * @return
     */
    @GetMapping(value = "/StartTransVideo")
    @ResponseBody
    @ApiOperation(value = "开始录制", notes = "channel", produces = "application/json")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelName", value = "通道编号", required = true, paramType = "form", dataType = "string"),
    })
    @ApiResponses({
            @ApiResponse(code = 200, response = AjaxResultData.class, message = "响应")

    })
    public AjaxResult StartTransVideo(
            @RequestParam(value = "channelName", required = false, defaultValue = "public") String channelName
    ) {
        // 加载配置
        init();
        this.name = channelName;
        final RecordingSDK recordingSDK = new RecordingSDK();
        final Common common = new Common();
        final Common.VideoMixingLayout videoMixingLayout = common.new VideoMixingLayout();
        videoMixingLayout.canvasWidth = 1000;
        videoMixingLayout.canvasHeight = 1000;
        videoMixingLayout.backgroundColor = "#2B2B2B";
        /**
         * 频道内显示用户（通信模式）/主播（直播模式）头像或视频的数量。
         */
        videoMixingLayout.regionCount = 5;
        System.out.println("----------开始录制------------");
        System.out.println(appid);
        System.out.println(channelKey);
        System.out.println(name);
//        final boolean channel = recordingSDK.createChannel(appid, channelKey, name, uid, recordingConfig, logLevel);
        final boolean channelWithUserAccount = recordingSDK.createChannelWithUserAccount(appid, channelKey, name, "99999999", recordingConfig, logLevel);
        System.out.println("----------" + channelWithUserAccount + "-----------");
        System.out.println("----------设置合流布局---------------");
        final int i = recordingSDK.setVideoMixingLayout(videoMixingLayout);
        System.out.println("----------" + i + "----------------");
        final RecordingEngineProperties properties = recordingSDK.getProperties();
        System.out.println("----------录制属性------------");
        System.out.println(properties);
        return AjaxResult.success();
    }

    @GetMapping(value = "/StartTransVideoTest")
    @ResponseBody
    @ApiOperation(value = "开始录制(测试 命令行模式)", notes = "channel(测试)", produces = "application/json")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelName", value = "频道编号", required = true, paramType = "form", dataType = "string"),
    })
    @ApiResponses({
            @ApiResponse(code = 200, response = AjaxResultData.class, message = "响应")

    })
    public void test(@RequestParam(value = "channelName", required = true) String channelName
    ) throws IOException {
        Dispatch dispatch = padCommonUtil.getDispatch();
        final HashMap<Object, Object> objectHashMap = new HashMap<>();
        objectHashMap.put("Recording_Dir", baseUrl + "videoPath/" + dispatch.getDispatchID().toString() + "/");
        dispatch.setDispatchID(dispatch.getDispatchID());
        dispatch.setTreatContent("/profile/videoPath/" + dispatch.getDispatchID().toString() + "/");
        dispatchService.updateById(dispatch);
        final String jsonString = JSON.toJSONString(objectHashMap);
        //生成配置文件
        final boolean hstest = CreateFileUtil.createJsonFile(jsonString, baseUrl + "jsonPath/", dispatch.getDispatchID().toString());
        System.out.println("----------------------------");
        System.out.println(hstest);
        System.out.println("----------------------------");
        String[] cmd = {"bash", "/Recording.sh", channelName, baseUrl + "jsonPath/" + dispatch.getDispatchID().toString() + ".json",appid};
        Runtime.getRuntime().exec(cmd);
    }

    /**
     * 加载配置
     */
    private void init() {
        recordingConfig = new RecordingConfig();
        /**
         * 设置录制属性
         */
        // 打开合流录制
        recordingConfig.isMixingEnabled = true;
        // 设置录制模式 成功MP4文件 音视频混合录制
        recordingConfig.mixedVideoAudio = Common.MIXED_AV_CODEC_TYPE.MIXED_AV_CODEC_V2;
        // 设置AgoraCoreServices 存放的目录
        recordingConfig.appliteDir = appliteDir;
        /**
         * 设置录制文件存放的根目录。默认值为 NULL。
         * 设置该参数后，会按照录制日期自动生成子目录保存录制文件。
         */
        recordingConfig.recordFileRootDir = recordFileRootDir;
        /**
         * 设置视频类型
         * JPG 文件格式 + MP4 视频文件格式。
         * 单流模式 (isMixingEnabled 为 false) 下，录制得 MP4 视频文件，并截图获得 JPG 文件。
         * 合流模式 (isMixingEnabled 为 true) 下，对合流录制，得到 MP4 视频文件，并对各单流截图，获得 JPG 文件。
         */
        recordingConfig.decodeVideo = Common.VIDEO_FORMAT_TYPE.VIDEO_FORMAT_JPG_VIDEO_FILE_TYPE;
        /**
         * 设置最低 UDP 端口。高 UDP 端口与低 UDP 端口差值不能小于 6。
         */
        recordingConfig.lowUdpPort = lowUdpPort;
        /**
         * 设置最高 UDP 端口。高 UDP 端口与低 UDP 端口差值不能小于 6。
         */
        recordingConfig.highUdpPort = highUdpPort;
        /**
         * 设置空闲频道的超时退出时间。该值需大于等于 3 秒，默认值为 300 秒。
         *
         * 该值需大于等于 3 秒。录制时，如果频道空闲（无用户）超过设定的时间，录制端自动退出频道，停止录制。
         *
         * 该段时间也会纳入计费。
         * 通信场景下，如果频道内有用户，但用户没有发流，不算作无用户状态。
         * 直播场景下，如果频道内有观众但无主播，一旦无主播的状态超过 idleLimitSec，录制程序会自动退出。
         */
        recordingConfig.idleLimitSec = idleLimitSec;

        /**
         * 设置频道模式为直播模式
         */
        recordingConfig.channelProfile = Common.CHANNEL_PROFILE_TYPE.CHANNEL_PROFILE_LIVE_BROADCASTING;

        recordingConfig.mixResolution = "360,15,640,500";
    }


}
